package com.je.app.view;

import java.awt.Component;
import java.awt.Container;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import com.je.app.control.ControlCaja;
import com.je.app.control.ControlConfiguracion;
import com.je.app.control.ControlHabitacion;
import com.je.app.control.ControlSesion;
import com.je.app.control.ControlStock;
import com.je.app.control.ControlTurno;


@SuppressWarnings("serial")
public class MainFrame extends JFrame {

	private static MainFrame instance ;
	public enum MessageType { EXITO, CONFIRMACION, ERROR, INFORMACION }; 

	private MainFrame(){
		
		setTitle("Hotel Flamingo");
		
		setIconImage(new ImageIcon("src/main/resources/icono.jpg").getImage());
		
		setBounds(0,0,1035,813);
		setLocationRelativeTo(null);
		setResizable(false);
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnInicio = new JMenu("Inicio");
		menuBar.add(mnInicio);
		mnInicio.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				ControlHabitacion.getInstance().abrirPanelHabitaciones();
			}
		});
		 
		JMenu mnCaja = new JMenu("Caja");
		menuBar.add(mnCaja);
		mnCaja.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				ControlCaja.getInstance().abrirCaja();
			}
		});
		
		JMenu mnStock = new JMenu("Stock");
		menuBar.add(mnStock);
		mnStock.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				ControlStock.getInstance().abrirStock();
			}
		});
		
		JMenu mnTurnos = new JMenu("Turnos");
		menuBar.add(mnTurnos);
		mnTurnos.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				ControlTurno.getInstance().abrirTurnos();
			}
		});
		
		if(ControlSesion.getInstance().getActiveSesion().getUsuario().isAdministrador()){

			JMenu mnSesiones = new JMenu("Sesiones");
			menuBar.add(mnSesiones);
			mnSesiones.addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					ControlSesion.getInstance().mostrarSesiones();
				}
			});

			JMenu mnResultados = new JMenu("Resultados mensuales");
			menuBar.add(mnResultados);
			mnResultados.addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					ControlSesion.getInstance().mostrarResultadosMensuales();
				}
			});

			JMenu mnObservaciones = new JMenu("Observaciones");
			menuBar.add(mnObservaciones);
			mnObservaciones.addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
		
					ControlConfiguracion.getInstance().abrirObservaciones();
				}
				
			});

			JMenu mnConfiguraciones = new JMenu("Configuraciones");
			menuBar.add(mnConfiguraciones);
			mnConfiguraciones.addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
		
					ControlConfiguracion.getInstance().abrirConfiguraciones();
				}
				
			});

		}

		JMenu mnDatosPersonales = new JMenu("Datos personales");
		menuBar.add(mnDatosPersonales);
		mnDatosPersonales.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				ControlSesion.getInstance().mostrarDatosPersonales();
			}
		});


		JMenu mnCerrarSesion = new JMenu("Cerrar sesi\u00F3n");
		menuBar.add(mnCerrarSesion);
		mnCerrarSesion.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				// DESLOGUEAR, FINALIZAR SESION, ETC
				ControlSesion.getInstance().cerrarSesion();
			}
		});
		
		
		try{
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		}
		catch(Exception e) {
			
		}
		setVisible(true);
	}
	
	public static MainFrame getInstance(){
		if(instance==null){
			instance= new MainFrame();
		}
		return instance;
	}
	
	public void setPanel(JPanel panel){
		setContentPane(panel);
	}
	
	public boolean showMessage(MessageType type, String mensaje){
		
		String msg;
		
		switch(type){
		
		case CONFIRMACION:
			msg = "Presione Aceptar para confirmar la operaci\u00F3n";
			if(mensaje!=null) msg = mensaje;

			int rn = JOptionPane.showConfirmDialog(null, msg,  "Confirmar", JOptionPane.OK_CANCEL_OPTION);

			if(rn==0) return true;
			else return false;

		case ERROR:
			msg = "La operaci\u00F3n no pudo ser realizada";
			if(mensaje!=null) msg = mensaje;
			
			Toolkit.getDefaultToolkit().beep(); 
			JOptionPane.showMessageDialog(null, msg,  "Mensaje de error", JOptionPane.ERROR_MESSAGE);
			
			return true;
			
		case EXITO:
			msg = "\u00A1La operaci\u00F3n se ha realizado con \u00E9xito!";
			if(mensaje!=null) msg = mensaje;
			
			JOptionPane.showMessageDialog(null, msg, "Mensaje de confirmaci\u00F3n", JOptionPane.INFORMATION_MESSAGE);
			
			return true;
			
		case INFORMACION:
			
			msg = "";
			if(mensaje!=null) msg = mensaje;
			
			JOptionPane.showMessageDialog(null, msg, "Mensaje de informaci\u00F3n", JOptionPane.INFORMATION_MESSAGE);
			
			return true;

		}
		
		return false;
		
	}

	public void setErrorMessage(String field, String message) {

		Component component = getComponent(field);
		
		if(component!=null){
			((JTextField) component).setText(message);
		}
		else{
			this.showMessage(MessageType.ERROR, "En el campo " + field.toUpperCase() + ": " + message);
		}

	}
	
	public void setProperty(String name, Object value){

		Component component = getComponent(name);
		((JTextField) component).setText(value.toString());
		
	}
	
	public Object getProperty(String name){

		Component component = getComponent(name);
		return ((JTextField) component).getText();

	}
	
	public void setTableModel(String scroll, List <Object []> list){

		Component component = getComponent(scroll);
		JTable table = (JTable) ((JScrollPane) component).getViewport().getComponent(0);
		DefaultTableModel modelo = ((DefaultTableModel)table.getModel()); 
		while(modelo.getRowCount()>0) modelo.removeRow(0);

		for(Object[] row: list){
			modelo.addRow(row);
		}
		
		
	}
	
	public DefaultTableModel getTableModel(String table){

		Component component = getComponent(table);
		return (DefaultTableModel) ((JTable) component).getModel();

	}
	
	
	public Component getComponent(String name){
		
		Component [] components = this.getContentPane().getComponents();
		for(Component component: components){
			if(name.equals(component.getName())){
				
				return component;
			}
		}
		
		return null;
	}
	
	public Component getComponent(Container contenedor, String name){
		
		
		for(Component component: contenedor.getComponents()){
			if(name.equals(component.getName())){
				
				return component;
			}
		}
		
		return null;
	}

	public void reset() {
		instance=null;
		
	}
	
	
	public void deshabilitarBotones(){
		Component [] components = this.getContentPane().getComponents(); 
		for(Component component : components){
			if(JButton.class.getName().equals(component.getClass().getName())) 
					if(((JButton)component).getName().equals("SYS_OCULTABLE")){
						((JButton)component).setEnabled(false);
					}
		}
	}
	
	public void habilitarBotones(){
		Component [] components = this.getContentPane().getComponents(); 
		for(Component component : components){
			if(JButton.class.getName().equals(component.getClass().getName())) 
					if(((JButton)component).getName().equals("SYS_OCULTABLE")){
						((JButton)component).setEnabled(true);
					}
		}	
	}
	
	public void cambiarEstado(Container contenedor, String nombreHabitacion, String estado){
		Component botonHabitacion = null;
		if(contenedor == null) botonHabitacion = getComponent(nombreHabitacion);
		else botonHabitacion = getComponent(contenedor, nombreHabitacion);
		if(botonHabitacion!=null){
			((JButton)botonHabitacion).setIcon(new ImageIcon("src/main/resources/botonesHabitaciones/"+estado+"/"+nombreHabitacion+".png"));
		}
	}
}
